<?php
session_start();
error_reporting(E_ALL);
ini_set('display_errors','On');
if (!defined('BASEPATH'))
    exit('No direct script access allowed');

/**
 *  Home Class  
 *  
 * @package CMS v2.0 
 * @subpackage News  
 * @author Vui Nguyen - 09/04/2013
 * @link http://joomlavui.info
 */
class Topup extends CI_Controller {

    /**
     * Contrust class
     *  
     * @access public 
     */
    public function __construct() {
		
        parent::__construct();
		$this->load->helper('url');		
        $this->load->library('smarty3', '', 'smarty');
        $this->load->library('captcha');
        $this->load->library('session');
        $this->load->library('email');
        // load models user,billing
        $this->load->model('kpay/db_user_model');
        $this->db_user_model		= new db_user_model();
        $this->load->model('kpay/db_billing_model');
        $this->db_billing_model		= new db_billing_model();
        //
        include APPPATH . 'libraries/pay/login_service.php';
        include APPPATH . 'libraries/pay/epay_Entries.php'; // gọi thư viện epay
        $this->login_lib 		= new login_service();        
        //
        require_once APPPATH . 'libraries/pay/nganluong/vi/include/lib/nusoap.php';
    }

    public function index() {
		///
		$msg				= "";
		$success			= "";	
		$SessionID			= "";
		$cardtype			= "";
		$provider			= "";
		$price				= "";
		// chọn loại thẻ
		// echo form_dropdown('name', $array_data, NULL, 'id="company" class="some-class"');
		$cardtype_data		= $this->db_user_model->getCardCategories(); // chọn loại thẻ
		if($cardtype_data){
                    foreach ($cardtype_data as $tmp) {
                        $cardtype[$tmp->catID] = $tmp->catName;
                    }
		}
		// end get session from epay
		$user_info = $this->session->userdata('user_info');
		if($user_info)
        	$this->smarty->assign("user_info", $user_info);
		//
                $this->smarty
                            ->assign("cardtype" , $cardtype)
                            ->assign("msg"		, $msg)
                            ->assign("success"	, $success)
                            ->display('template/topup/home');
    }	
	/////////////////////////////START BUY CARD BY EPAY///////////////////////////////
	function topup_vi(){ //echo -1;exit;
            //	
            $msgs	= array();
            $msg	= "";
            $code 	= -1;
            $card_info  = "";
            // POST VALUE		
            $data['productID']		= $this->input->post('productID');
            $data['cardprice']		= $data['productID'];
            $data['phoneReceiver']      = $this->input->post('phonereceiver'); // số điện thoại nhận
            $data['paymethod']		= $this->input->post('paymethod');
            // Get user info
            $user_info = $this->session->userdata('user_info');
            if(!$user_info){
                    $code 		= -1;
                    $msgs[] 	= "Vui lòng đăng nhập.";
                    //
                    $uID 			= "";
                    $username		= "";
                    $customerID 	= "";
                    $email 			= "";
            }else{
                    $uID 			= $user_info[0]->uID;
                    $username		= $user_info[0]->username;
                    $customerID 	= $user_info[0]->customerID;
                    $email 			= $user_info[0]->email;	
                    $coin_info		= $this->db_user_model->getUserByCustomerID($customerID);
                    if($coin_info)
                            $Coin 		= $coin_info[0]->Coin;
            }
            // check valid coin
            if($Coin*TI_LE_QUI_DOI < $data['cardprice']){
                    $code 		= -1;
                    $msgs[] 	= "Số dư trong tài khoản không đủ để thực hiện giao dịch!";	
            }            
            //// CHECK VALUE
            // Check catID,ProviderID,Product ID valid.				
            if(!$data['productID'] or !$data['phoneReceiver']){
                $code 		= -1;
                $msgs[] 	= "Thông tin mua thẻ không hợp lệ.";
            }
            // check money in_array
            /////////////////////////////////////	
            $log_init					= "";// khởi tạo dữ liệu			
            $log_init['ip'] 			= get_real_ip();
            //$log_init['created'] 		= mktime(0, 0, 0, date('m') , date('d'), date('Y'));
            $log_init['created'] 		= time();
            $log_init['date'] 			= date("Y-m-d H:i:s");
            $log_init['transID'] 		= TRANSID_BANTIEN.$data['productID']."_".$log_init['created'];		
            $log_init['phoneReceiver']          = $data['phoneReceiver'];
            $log_init['cardprice'] 		= $data['cardprice'];
            $log_init['paymethod']		= $data['paymethod'];
            $log_init['typeUse']		= TRANSID_TYPE_USE_BANTIEN;
            if(!count($msgs)) {
                // START - SAU KHI NẠP THẺ LẬP TỨC KHỞI TẠO LOG GIAO DỊCH CHO DÙ SAI HAY ĐÚNG.
                // E1.SAVE LOG KHỞI TẠO GIAO DỊCH TRƯỚC KHI ĐĂNG NHẬP VÀO EPAY
                $aParamCardLog=array(                                
                                'uID' 			=> $uID,				
                                'username'		=> $username,
                                'email' 		=> $email,
                                'customerID' 	=> $customerID,
                                'transID' 		=> $log_init['transID'],				
                                'phoneReceiver' => $log_init['phoneReceiver'],
                                'cardprice' 	=> $log_init['cardprice'],
                                'typeUse' 		=> $log_init['typeUse'],
                                'paySource' 		=> MUATHEVN,
                                "date"			=> $log_init['date'],
                                'created' 		=> $log_init['created'],
                                'statusDesc' 	=> "Khởi tạo",
                                'status' 		=> "-2",
                                'ip' 			=> $log_init['ip']
                        );		
                // 
                $log1 					= $this->db_billing_model->ano_logbilling_init($aParamCardLog); //ok            	               
                $code 		= 1;
                $msgs[] 	= "Giao dịch thành công.";
                ///topup
                $this->topupDirectToPhoneFromEpay($data,$log_init,$card_info, $msgs);
            }// end check count msg	
            foreach ($msgs as $m){
                    $msg.="$m<br/>";			
            }
            $msg	= json_encode(array("code"=>$code,"msg"=>$msg)); //print_r(json_decode($msg));
            echo $msg;exit;
            //echo json_decode($msg);exit;
	}
	// DIRECT TOPUP TO PHONE NUMBER
	function directTopup($itopupClient,$phoneReceiver,$cardprice,$requestID){		
            //Generate RequestID to request Direct Topup		
            $targetAccount      = $phoneReceiver;//"0911111111";
            $amount 		= $cardprice;//10000;
            //Goi ham nay de thuc hien topup
            $result		= $itopupClient->directTopup($requestID, $targetAccount, $amount);
            return $result;
	}
        /**********************************START KHO THE EPAY***************************************/
	// DIRECT TOPUP TO GAME ACCOUNT
	function directTopupGame($itopupClient){
		echo "__________________________________________________<br>";
		echo "<br><b>Direct Topup Test. Cac tham so dau vao: </b><br>";
		//Generate RequestID to request Direct Topup
		$requestID = $itopupClient->generateRandomRequestID();		//Bat buoc phai sinh ra	
		//$targetAccount = "0925160618";								//Ten tai khoan game
		//$targetAccount = "09411111111";
		$amount = 10000;											//Luong tien nap ban
		$providerCode = 'FPT';				//
		//$providerCode = 'HDC-KVDD';	
		//$providerCode = 'VTC';
		//$providerCode = 'VinaGame';
		//$providerCode = 'Net2E';
		$targetAccount = 'epay_test';
		//$providerCode='HDC_THBAI';
		
		//$targetAccount = 'epaytest';
		#$targetAccount = "0911111111";
		#$providerCode='Vinaphone';
		
		echo "(Generated) RequestID (Ma sinh ra):<b> ". $requestID. "</b><br>";
		echo "Nha cung cap Game:<b> ". $providerCode. "</b><br>";
		echo "TargetAccount (Tai khoan game): <b>". $targetAccount. "</b><br>";
		echo "Amount (Luong tien): <b>". $amount. "</b> VND<br>";
		
		//Goi ham nay de thuc hien topup
		$result		= $itopupClient->directTopupGame($requestID, $providerCode, $targetAccount, $amount);
		return $result;
	}
	// Get card provider
	function  getCardProviders($catID=null)
	{
		// POST VALUE
		$catID 					= $this->input->post('catID');
		if($catID)
		{
			$provider_data		= $this->db_user_model->getCardProviders($catID); // vinaphone
			if($provider_data){
			  foreach ($provider_data as $tmp) {
				  $provider[$tmp->providerID] = $tmp->providerName;
			  }
			  $result		= json_encode($provider);
			}else{
				$result		=-1;
			}			
		}else{
			$result		=-1;
		}
		echo $result;
	}
	// get card price
	function getCardPrice($providerID=null)
	{
		// POST VALUE
		$providerID 					= $this->input->post('providerID');
		if($providerID)
		{
			$price_data		= $this->db_user_model->getCardProducts($providerID); // vinaphone
			if($price_data){
			  foreach ($price_data as $tmp) {
				  $price[$tmp->productID] = $tmp->productName;
			  }
			  $result		= json_encode($price);
			}else{
				$result		=-1;
			}
		}else{
			$result		=-1;
		}
		echo $result;
	}
        /**********************************END KHO THE EPAY***************************************/
	/////////////////////////////START TOPUP VI///////////////////////////////
	function vi(){
		///
		$msg				= "";
		$success			= "";	
                $user_info			= "";	
		// end get session from epay
		$user_info = $this->session->userdata('user_info');		               
		//
                $this->smarty
                            //->assign("cardtype" , $cardtype)
                            ->assign("user_info", $user_info)
                            ->assign("msg"		, $msg)
                            ->assign("success"	, $success)
                            ->display('template/topup/home_vi');	
	}
	/////////////////////////////END TOPUP VI///////////////////////////////
        /**********************************START SMARTLINK*******************************************/
	////////////////////// THANH TOÁN MUA THẺ BỞI SMARTLINK //////////////////////
	function topup_smartlink($Email=NULL){
            //
            include APPPATH . 'libraries/pay/smartlink/config_sm.php'; // thư viện smartlink
            //define lai url callback
            $vpc_ReturnURL   =   base_url()."topup/topup_smartlink_callback";
            //Địa chỉ URL của Merchant tiếp nhận kết quả thanh toán trả về từ Cổng thanh toán.
            $vpc_BackURL     =   base_url()."topup/topup_smartlink_cancel";
            //Địa chỉ URL của Merchant tiếp nhận yêu cầu tiếp tục mua hàng khi khách hàng thực hiện chức năng huỷ từ Cổng thanh toán.
            $_SESSION['cardReceived'] = - 100;// start session card.
            $msgs	= array();
            $msg	= "";
            $code 	= -1;		
            $time	= time();
            // check if get email
            //$email 			= $this->input->post('email');
            // if email will get user info else call session            
            if($Email){
                $_SESSION['pay']['store_info_init']['Email'] = $Email;
                $user_info = $this->db_user_model->getUserByEmail($Email);
                if($user_info){
                    $uID 			= $user_info[0]->uID;
                    $username                   = $user_info[0]->username;
                    $customerID                 = $user_info[0]->customerID;
                    $email 			= $user_info[0]->email;	
                }    
            }else{
                // Get user info
                $user_info = $this->session->userdata('user_info');
                if($user_info){                    
                    $uID 			= $user_info[0]->uID;
                    $username                   = $user_info[0]->username;
                    $customerID                 = $user_info[0]->customerID;
                    $email 			= $user_info[0]->email;	                    
                }else{
                    $code 		= -1;
                    $msgs[]             = "Thông tin tài khoản không hợp lệ.";
                }
            }    
            ////
            //print_r($_SESSION['pay']['store_info_init']);exit;
            $pay_store_info_init	= "";
            if(isset($_SESSION['pay']['store_info_init'])){
                    $pay_store_info_init = $_SESSION['pay']['store_info_init'];
            }else{
                    $code 		= -1;
                    $msgs[] 	= "Dữ liệu khởi tạo không hợp lệ.";
            }
            
            if(!count($msgs)){
                // code here				
                // post value and redirect url (FIXED CỐ ĐỊNH, KHÔNG ĐƯỢC THÊM VÀO BẤT CỨ GÌ)
                $data['Title'] 			= "Topup Phone";
                //$data['xxx'] 			= "PHP Merchant";
                $data['vpc_AccessCode'] = vpc_AccessCode;
                $data['vpc_Amount']		= $pay_store_info_init['cardprice'];
                $data['vpc_BackURL']	= $vpc_ReturnURL;
                $data['vpc_Command']	= vpc_Command;
                $data['vpc_Currency']	= vpc_Currency;
                $data['vpc_Locale']		= vpc_Locale;
                $data['vpc_MerchTxnRef']= TRANSID_PAY_BY_SMARTLINK.$pay_store_info_init['phonereceiver']."_".DATE;//vpc_MerchTxnRef;
                $data['vpc_Merchant']	= vpc_Merchant;
                $data['vpc_OrderInfo']	= vpc_OrderInfo;
                $data['vpc_ReturnURL']	= $vpc_ReturnURL;
                $data['vpc_Version']	= vpc_Version;
                //print_r($data);exit;
                // SAVE LOG KHỞI TẠO
                /////////////////////////////////////	
                $log_init					= "";// khởi tạo dữ liệu			
                $log_init['ip'] 			= get_real_ip();
                $log_init['created'] 		= $time;
                $log_init['date'] 			= date("Y-m-d H:i:s");
                $log_init['transID'] 		= $data['vpc_MerchTxnRef'];                
                $log_init['phoneReceiver'] 	= $pay_store_info_init['phonereceiver'];                                
                $log_init['cardprice'] 		= $pay_store_info_init['cardprice'];
                $log_init['paymethod']		= $pay_store_info_init['paymethod'];
                $log_init['typeUse']		= TRANSID_TYPE_USE_BANTIEN;
                // E1.SAVE LOG KHỞI TẠO GIAO DỊCH TRƯỚC KHI ĐĂNG NHẬP VÀO EPAY
                $aParamCardLog=array(                                
                                'uID' 			=> $uID,				
                                'username'		=> $username,
                                'email' 		=> $email,
                                'customerID' 	=> $customerID,
                                'transID' 		=> $log_init['transID'],
                                // payment info
                                'merchantTransactionRef' 	=> $data['vpc_MerchTxnRef'],
                                'transactionOrderInfo'		=> $data['vpc_OrderInfo'],
                                ///                                
                                'phoneReceiver' 	=> $log_init['phoneReceiver'],                                
                                'cardprice' 	=> $log_init['cardprice'],
                                'paySource' 	=> "smartlink",
                                'typeUse' 		=> $log_init['typeUse'],
                                "date"			=> $log_init['date'],
                                'created' 		=> $log_init['created'],
                                'statusDesc' 	=> "Khởi tạo",
                                'status' 		=> "-2",
                                'ip' 			=> $log_init['ip']
                        );		
                // 
                $log1 					= $this->db_billing_model->ano_logbilling_init($aParamCardLog); //ok
                // Define Constants
                // ----------------
                // This is secret for encoding the MD5 hash
                // This secret will vary from merchant to merchant
                // To not create a secure hash, let SECURE_SECRET be an empty string - ""
                // $SECURE_SECRET = "secure-hash-secret";
                $SECURE_SECRET = Secure_Secret;

                // add the start of the vpcURL querystring parameters
                $vpcURL = virtualPaymentClientURL . "?";

                // Remove the Virtual Payment Client URL from the parameter hash as we 
                // do not want to send these fields to the Virtual Payment Client.
                unset($_POST["virtualPaymentClientURL"]); 
                unset($_POST["SubButL"]);

                // Create the request to the Virtual Payment Client which is a URL encoded GET
                // request. Since we are looping through all the data we may as well sort it in
                // case we want to create a secure hash and add it to the VPC data if the
                // merchant secret has been provided.
                $md5HashData = $SECURE_SECRET;
                //ksort ($_POST);
                ksort ($data);

                // set a parameter to show the first pair in the URL
                $appendAmp = 0;
                //print_r ($_POST);exit;
                //foreach($_POST as $key => $value) {
                foreach($data as $key => $value) {			
                        // create the md5 input and URL leaving out any fields that have no value
                        if (strlen($value) > 0) {

                                // this ensures the first paramter of the URL is preceded by the '?' char
                                if ($appendAmp == 0) {
                                        $vpcURL .= urlencode($key) . '=' . urlencode($value);
                                        $appendAmp = 1;
                                } else {
                                        $vpcURL .= '&' . urlencode($key) . "=" . urlencode($value);
                                }
                                $md5HashData .= $value;
                        }
                }

                // Create the secure hash and append it to the Virtual Payment Client Data if
                // the merchant secret has been provided.
                if (strlen($SECURE_SECRET) > 0) {
                        $vpcURL .= "&vpc_SecureHash=" . strtoupper(md5($md5HashData));
                }

                // FINISH TRANSACTION - Redirect the customers using the Digital Order
                // ===================================================================
                //header("Location: ".$vpcURL);
                redirect($vpcURL);
            }else{
                foreach ($msgs as $m){
                    $msg.="$m<br/>";			
                }
                $msg	= json_encode(array("code"=>$code,"msg"=>$msg));
                $user_info = $this->session->userdata('user_info');
                if($user_info)
                    $this->smarty->assign("user_info", $user_info);
                //		
                $this->smarty
                            //->assign("card_info" , $card_info)
                            ->assign("msg"		, json_decode($msg))
                            ->display('template/topup/home_info');
            }
	}	
	////// THANH TOÁN MUA THẺ BỞI SMARTLINK	
	function topup_smartlink_callback(){
		// code here		
		$msg				= "";
		$msgs				= array();
		$success			= "";	
		$card_info			= "";
		//
		//print_r($_GET);exit;
		// code here (sau khi thanh toán thành công, tiến hành gọi hàm lấy mã thẻ cho user)
		include APPPATH . 'libraries/pay/smartlink/config_sm.php';
		//$pay_store_info_init= $data;
		$SECURE_SECRET = Secure_Secret;
		// If there has been a merchant secret set then sort and loop through all the
		// do not want to include this field in the hash calculation
		$vpc_Txn_Secure_Hash = $_GET["vpc_SecureHash"];
		unset($_GET["vpc_SecureHash"]); 
		// set a flag to indicate if hash has been validated
		$errorExists = false;
		if (strlen($SECURE_SECRET) > 0 && $_GET["vpc_ResponseCode"] != "No Value Returned") {
		
			$md5HashData = $SECURE_SECRET;
		
			// sort all the incoming vpc response fields and leave out any with no value
			foreach($_GET as $key => $value) {
				if ($key != "vpc_SecureHash" or strlen($value) > 0) {
					$md5HashData .= $value;
				}
			}
			// Validate the Secure Hash (remember MD5 hashes are not case sensitive)
			// This is just one way of displaying the result of checking the hash.
			// In production, you would work out your own way of presenting the result.
			// The hash check is all about detecting if the data has changed in transit.
			if (strtoupper($vpc_Txn_Secure_Hash) == strtoupper(md5($md5HashData))) {
				// Secure Hash validation succeeded, add a data field to be displayed
				// later.
				//$hashValidated = "<FONT color='#00AA00'><strong>CORRECT</strong></FONT>";
				$hashValidated	= 1; // valid hash
			}else {
				// Secure Hash validation failed, add a data field to be displayed
				// later.
				//$hashValidated = "<FONT color='#FF0066'><strong>INVALID HASH</strong></FONT>";
				$hashValidated	= -100; // invalid hash // định hack hệ thống hả, hihi
				$errorExists 	= true;
				$code 			= -1;
				$msgs[] 		= "Dữ liệu không hợp lệ.H001.";
			}
		} else {
			// Secure Hash was not validated, add a data field to be displayed later.
			//$hashValidated = "<FONT color='orange'><strong>Not Calculated - No 'SECURE_SECRET' present.</strong></FONT>";
				$code 			= -1;
				$msgs[] 		= "Lỗi hệ thống.H002."; //Not Calculated - No 'SECURE_SECRET' present
		}
		
		// Define Variables
		// ----------------
		// Extract the available receipt fields from the VPC Response
		// If not present then let the value be equal to 'No Value Returned'
		
		// Standard Receipt Data
		$version         = $this->null2unknown(($_GET["vpc_Version"]));
		$locale          = $this->null2unknown(($_GET["vpc_Locale"]));
		$command         = $this->null2unknown(($_GET["vpc_Command"]));
		$merchantID      = $this->null2unknown(($_GET["vpc_Merchant"]));
		$merchTxnRef     = $this->null2unknown(($_GET["vpc_MerchTxnRef"]));		
		$amount          = $this->null2unknown(($_GET["vpc_Amount"]));
		$currencyCode    = $this->null2unknown(($_GET["vpc_CurrencyCode"]));
		$orderInfo       = $this->null2unknown(($_GET["vpc_OrderInfo"]));
		$txnResponseCode = $this->null2unknown(($_GET["vpc_ResponseCode"]));
		//txnResponseCode: Có giá trị bằng "0" (zero) khi giao dịch thành công và được cấp phép thanh toán bởi
		// Ngân hàng phát hành. Các giá trị khác đều có nghĩa là không thành công
		//
		$errorMessage	 = $this->getResponseDescription($txnResponseCode);
		$transactionNo   = $this->null2unknown(isset($_GET["vpc_TransactionNo"]));
		//exit;
		//$additionData    = $this->null2unknown($_GET["vpc_AdditionData"]);
		$batchNo         = $this->null2unknown(isset($_GET["vpc_BatchNo"]));
		//$acqResponseCode = $this->null2unknown($_GET["vpc_AcqResponseCode"]);
		//$message         = $this->null2unknown($_GET["vpc_Message"]);
		//echo $hashValidated;exit;
		if(!count($msgs)) {
                    // check thông tin mã hash trả về và responsecode và 1 số điều kiện khác nếu có. &&&&
                    if($hashValidated==1 && $txnResponseCode==0){ // success			
                        try{   
                            ///////////////////////////////////////////////////////
                            // check chỉ get 1 lần duy nhất ứng với mỗi giao dịch.
                            // check session va status cua giao dich                            
                            $this->topup_getCardCodeCallBack($merchTxnRef, $card_info);//goi kho the simpay
                            /////////////////////////////////////////////////////// 
                            // E3.START SAVE LOG SUCCESS
                            $aParamCardLog=array(
                                    'transID' 		=> $merchTxnRef,// key để biết được record sẽ updated
                                    'partnerTransID'    => $merchTxnRef,// key để biết được record sẽ updated
                                    'transIdRes' 	=> $merchTxnRef,// key để biết được record sẽ updated
                                    //
                                    // payment info
                                    'transactionOrderInfo'	=> $orderInfo,
                                    'transactionNumber'		=> $transactionNo,
                                    'batchNumber'			=> $batchNo,
                                    //
                                    'amount'		=> $amount, // nếu thành công mới save số tiền vào									
                                    // mess
                                    'errorCode'		=> $txnResponseCode,
                                    'errorMessage'	=> $errorMessage,
                                    'epayStatus'	=> 1,                                    
                                    //
                                    'updated' 		=> date("Y-m-d H:i:s"),
                                    'statusDesc' 	=> "Thành công",
                                    'status' 		=> "1"
                            );
                            // update customer ID for user table
                            $aUpdate	= array("partnerTransID","transIdRes","transactionOrderInfo","transactionNumber","batchNumber","amount","errorCode","errorMessage","epayStatus","updated","statusDesc","status");		
                            $log3 			= $this->db_billing_model->insert_onduplicate_logbilling_update($aParamCardLog,$aUpdate); //ok
                            //
                            $code 		= 1;
                            $msgs[]             = "Giao dịch thành công.";
                                                       
                        } catch (Exception $e) {
                                //echo 'Caught exception: ',  $e->getMessage(), "\n";exit;
                                $code 		= -1;
                                $msgs[] 	= "Caught exception: .".$e->getMessage();
                        }
                    }elseif($hashValidated==1 && $txnResponseCode!=0){
                            try{ 
                                    // E3.START SAVE LOG FAILED
                                    $aParamCardLog=array(
                                                    'transID' 		=> $merchTxnRef,// key để biết được record sẽ updated
                                                    'partnerTransID' => $merchTxnRef,// key để biết được record sẽ updated
                                                    'transIdRes' 	=> $merchTxnRef,// key để biết được record sẽ updated
                                                    //
                                                    // payment info
                                                    'transactionOrderInfo'	=> $orderInfo,
                                                    'transactionNumber'		=> $transactionNo,
                                                    'batchNumber'			=> $batchNo,
                                                    //
                                                    'amount'		=> $amount, // nếu thành công mới save số tiền vào									
                                                    // mess
                                                    'errorCode'		=> $txnResponseCode,
                                                    'errorMessage'	=> $errorMessage,
                                                    'epayStatus'	=> $txnResponseCode,
                                                    //
                                                    'updated' 		=> date("Y-m-d H:i:s"),
                                                    'statusDesc' 	=> "Thất bại",
                                                    'status' 		=> "0"
                                            );
                                    //print_r($aParamCardLog);exit;
                                    // update customer ID for user table
                                    $aUpdate	= array("transID","partnerTransID","transIdRes","transactionOrderInfo","transactionNumber","batchNumber","amount","errorCode","errorMessage","epayStatus","updated","statusDesc","status");		
                                    $log3 			= $this->db_billing_model->insert_onduplicate_logbilling_update($aParamCardLog,$aUpdate); //ok
                                    //
                                    $code 		= -1;
                                    $msgs[] 	= "Giao dịch thất bại. Vui lòng thử lại hoặc liên hệ bộ phận hỗ trợ để biết thêm chi tiết.";
                            } catch (Exception $e) {
                                    //echo 'Caught exception: ',  $e->getMessage(), "\n";exit;
                                    $code 		= -1;
                                    $msgs[] 	= "Caught exception: .".$e->getMessage();
                            }		
                    }// end check respon from bank			
		}else{			
			$code 		= -1;
			$msgs[] 	= "Vui lòng liên hệ bộ phận hỗ trợ để biết thêm chi tiết.";
		} // end count mess	
		///	
		foreach ($msgs as $m){
			$msg.="$m<br/>";			
		}
		$msg	= json_encode(array("code"=>$code,"msg"=>$msg));	
		//print_r($msg);
		// *******************
		// END OF MAIN PROGRAM
		// *******************			
		$user_info = $this->session->userdata('user_info');
		if($user_info)
                    $this->smarty->assign("user_info", $user_info);
                if(isset($_SESSION['card_info']))
                    $card_info  = $_SESSION['card_info'];                
		//		
		$this->smarty
					->assign("card_info" , $card_info)
					->assign("msg"		, json_decode($msg))
					->display('template/topup/home');
	}
	////// THANH TOÁN MUA THẺ BỞI SMARTLINK
	function topup_smartlink_cancel(){//echo "cancel";exit;
		//
		include APPPATH . 'libraries/pay/smartlink/config_sm.php'; // thư viện smartlink
		// code here
		//include APPPATH . 'libraries/pay/smartlink/config_sm.php';
		//$pay_store_info_init= $data;
		//print_r($pay_store_info_init);
		redirect("");
	}
        
	// End Processing

	// This method uses the QSI Response code retrieved from the Digital
	// Receipt and returns an appropriate description for the QSI Response Code
	//
	// @param $responseCode String containing the QSI Response Code
	//
	// @return String containing the appropriate description
	//
	function getResponseDescription($responseCode) {	
		switch ($responseCode) {
			case "0" : $result = "Giao dịch thành công"; break;
			case "1" : $result = "Ngân hàng từ chối thanh toán: thẻ/tài khoản bị khoá"; break;
			case "2" : $result = "Lỗi số 2"; break;
			case "3" : $result = "Thẻ hết hạn"; break;
			case "4" : $result = "Quá số lần giao dịch cho phép. (Sai OTP, quá hạn mức trong ngày)"; break;
			case "5" : $result = "Không có trả lời từ ngân hàng"; break;
			case "6" : $result = "Lỗi giao tiếp với ngân hàng"; break;
			case "7" : $result = "Tài khoản không đủ tiền"; break;
			case "8" : $result = "Lỗi truyền dữ liệu"; break;
			case "9" : $result = "Kiểu giao dịch không được hỗ trợ"; break;
			case "10" : $result = "Lỗi Khác"; break;
			case "11" : $result = "Giao dịch chưa được xác thực OTP"; break;
			case "12" : $result = "Giao dịch không thành công, thẻ vượt quá hạn mức trong ngày"; break;
			case "13" : $result = "Thẻ chưa đăng ký dịch vụ giao dịch qua internet"; break;
			case "14" : $result = "Sai OTP"; break;
			case "15" : $result = "Sai mật khẩu"; break;
			case "16" : $result = "Sai tên chủ thẻ"; break;
			case "17" : $result = "Sai số thẻ"; break;
			case "18" : $result = "Sai ngày hiệu lực thẻ (sai ngày phát hành)"; break;
			case "19" : $result = "Sai ngày hiệu lực thẻ (sai ngày hết hạn)"; break;
			case "20" : $result = "OTP Timeout"; break;
			case "22" : $result = "Chưa xác thực thông tin thẻ"; break;
			case "23" : $result = "Không đủ điều kiện thanh toán (thẻ/tài khoản không hợp lệ hoặc TK không đủ
số dư)."; break;
			case "24" : $result = "Giao dịch không thành công, số tiền giao dịch vượt quá hạn mức 1 lần thanh
toán."; break;
			case "25" : $result = "Giao dịch không thành công, số tiền giao dịch vượt hạn mức thanh toán."; break;
			case "26" : $result = "Giao dịch chờ xác nhận từ Ngân hàng."; break;
			default  : $result = "Không xác định lỗi"; 
		}
		return $result;
	}
	//  -----------------------------------------------------------------------------	
	// If input is null, returns string "No Value Returned", else returns input
	function null2unknown($data) {
		if ($data == "") {
			return "No Value Returned";
		} else {
			return $data;
		}
	} 		
	//  ----------------------------------------------------------------------------
	/********************************END SMARTLINK*********************************************/
        /**********************************START BẢO KIM*******************************************/
	////////////////////// THANH TOÁN QUA VÍ BẢO KIM //////////////////////
	function topup_baokim($Email=NULL){
            // include thư viện
            include APPPATH . 'libraries/pay/baokim/vi/baokim/BaoKimPayment.php'; // thư viện smartlink
            include APPPATH . 'libraries/pay/baokim/vi/config_bk.php'; // file config
            //
            //define lai url callback
            $url_success        =   base_url()."topup/topup_baokim_callback";           
            $url_cancel         =   base_url()."topup/topup_baokim_cancel";
            $url_detail         =   base_url()."topup/topup_baokim_detail";
            $_SESSION['cardReceived']='-100';// start baor kim session card
            $msgs	= array();
            $msg	= "";
            $code 	= -1;		
            $time	= time();
            if($Email){
                $_SESSION['pay']['store_info_init']['Email'] = $Email;
                $user_info = $this->db_user_model->getUserByEmail($Email);
                if($user_info){
                    $uID 			= $user_info[0]->uID;
                    $username                   = $user_info[0]->username;
                    $customerID                 = $user_info[0]->customerID;
                    $email 			= $user_info[0]->email;	
                }    
            }else{
                // Get user info
                $user_info = $this->session->userdata('user_info');
                if($user_info){                    
                    $uID 			= $user_info[0]->uID;
                    $username                   = $user_info[0]->username;
                    $customerID                 = $user_info[0]->customerID;
                    $email 			= $user_info[0]->email;	                    
                }else{
                    $code 		= -1;
                    $msgs[]             = "Thông tin tài khoản không hợp lệ.";
                }
            } 
            ////
            $pay_store_info_init	= "";
            if(isset($_SESSION['pay']['store_info_init'])){
                    $pay_store_info_init = $_SESSION['pay']['store_info_init'];
            }else{
                    $code 		= -1;
                    $msgs[] 	= "Dữ liệu khởi tạo không hợp lệ.";
            }            
            /// Thông tin khởi tạo cho Bảo Kim		
            $total_amount 	= $pay_store_info_init['cardprice'];//$_POST['total_amount'];
            $order_id 		= TRANSID_PAY_BY_BAOKIM.$pay_store_info_init['phonereceiver']."_".DATE;
            $business 		= BUSINESS;//"trungbq@dos.com.vn";//"vnv1004@gmail.com";
            $description 	= "Thanh toán đơn hàng ".$order_id;
            $order_description = $description;
            $shipping_fee 	= SHIPPING_FREE; //Nếu tính thêm phí vận chuyển thì thiết lập tại đây
            $tax_fee 		= TAX_FREE; //Nếu tính thêm phí thuế thì thiết lập tại đây
            $url_success 	= $url_success;
            //URL callback khi thanh toán thành công để update thông tin 
            $url_cancel 	= $url_cancel; 
            //Url khi click link "Tôi không muốn thanh toán đơn hàng này" trên cổng thanh toán Bảo Kim
            $url_detail 	= $url_detail; 
            //Url chứa thông tin chi tiết đơn hàng		
            $baokim 		= new BaoKimPayment();
            $request_url 	= $baokim->createRequestUrl($order_id, $business, $total_amount, $shipping_fee, $tax_fee, $order_description, $url_success, $url_cancel, $url_detail);
            // SAVE LOG KHỞI TẠO
            /////////////////////////////////////	
            $log_init					= "";// khởi tạo dữ liệu			
            $log_init['ip'] 			= get_real_ip();
            $log_init['created'] 		= $time;
            $log_init['date'] 			= date("Y-m-d H:i:s");
            $log_init['transID'] 		= $order_id; // chính là order ID            
            $log_init['phoneReceiver'] 		= $pay_store_info_init['phonereceiver'];                        
            $log_init['cardprice'] 		= $pay_store_info_init['cardprice'];
            $log_init['paymethod']		= $pay_store_info_init['paymethod'];
            $log_init['typeUse']		= TRANSID_TYPE_USE_PAY;
            // E1.SAVE LOG KHỞI TẠO GIAO DỊCH TRƯỚC KHI ĐĂNG NHẬP VÀO EPAY
            $aParamCardLog=array(                                
                            'uID' 			=> $uID,				
                            'username'		=> $username,
                            'email' 		=> $email,
                            'customerID' 	=> $customerID,
                            'transID' 		=> $log_init['transID'],
                            // payment info
                            'transactionOrderInfo'		=> $order_description,
                            ///                            
                            'phoneReceiver' 	=> $log_init['phoneReceiver'],                            
                            'cardprice' 	=> $log_init['cardprice'],
                            'paySource' 	=> "baokim",
                            'typeUse' 		=> $log_init['typeUse'],
                            "date"			=> $log_init['date'],
                            'created' 		=> $log_init['created'],
                            'statusDesc' 	=> "Khởi tạo",
                            'status' 		=> "-2",
                            'ip' 			=> $log_init['ip']
                    );		
            // 
            $log1 					= $this->db_billing_model->ano_logbilling_init($aParamCardLog); //ok
            //echo $request_url;exit;
            echo "<meta http-equiv='refresh' content='0;url=$request_url' />";		
            //echo $request_url;exit;
            //redirect($request_url);
            //echo "bc bk";exit;	
	}
	//
	function topup_baokim_callback(){
		// include thư viện
		include APPPATH . 'libraries/pay/baokim/vi/baokim/BaoKimPayment.php'; // thư viện smartlink
		include APPPATH . 'libraries/pay/baokim/vi/config_bk.php'; // file config
		//	
		$msgs	= array();
		$msg	= "";
		$code 	= -1;		
		$time	= time();
		$card_info	= "";
		//Baokim Payment Notification (BPN) Sample
		//Lay thong tin tu Baokim POST sang
		$req = '';
		foreach ( $_POST as $key => $value ) {
			$value = urlencode ( stripslashes ( $value ) );
			$req .= "&$key=$value";
		}
                //print_r($_POST);exit;
		//thuc hien  ghi log cac tin nhan BPN
		/*$myFile = "logs/bpn.log";
		$fh = fopen($myFile, 'a') or die("can't open file");
		$text = "\n\n".$_SERVER['REMOTE_ADDR']."-".date("j,m,Y, H:i:s a").$req."\n\n";
		fwrite($fh, $text);*/
		
		$ch = curl_init();		
		//Dia chi chay BPN test
		//curl_setopt($ch, CURLOPT_URL,'http://sandbox.baokim.vn/bpn/verify');		
		//Dia chi chay BPN that
		curl_setopt($ch, CURLOPT_URL,'https://www.baokim.vn/bpn/verify');
		curl_setopt($ch, CURLOPT_VERBOSE, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_POST, 1);
		curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
		$result = curl_exec($ch);
		$status = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
		$error = curl_error($ch);
		if($_POST){
                    if($result != '' && strstr($result,'VERIFIED') && $status==200){
                            //thuc hien update hoa don
                            fwrite($fh, 		' => VERIFIED');			
                            $order_id 			= $_POST['order_id'];			
                            $transaction_id 	= $_POST['transaction_id'];			
                            $transaction_status = $_POST['transaction_status'];			
                            $total_amount		= $_POST['total_amount'];			
                            $net_amount			= $_POST['net_amount'];			
                            $fee_amount			= $_POST['fee_amount'];			
                            $customer_name		= $_POST['customer_name'];			
                            $customer_address 	= $_POST['customer_address'];	
                            $customerData		= "Net_amount:".$net_amount."-"."Fee_amount:".$fee_amount."-"."Customer_name:".$customer_name."-"."Customer_address:".$customer_address;
                            //kiem tra trang thai giao dich
                            if ($transaction_status == 4||$transaction_status == 13){
                            // Trang thai giao dich =4 la thanh toan truc tiep = 13 la thanh toan an toan			                        
                            // mai code nha.
                            // check
                            $tmp_status = $this->db_user_model->getTransIDStatus($order_id);// =1ok;else:false
                            if(!$tmp_status){ // if success trans will don't get card code.
                                if($_SESSION['cardReceived']=='-100'){
                                    // CHUYỂN QUA BƯỚC GET MÃ THẺ
                                    $card_info	= json_decode($this->topup_open_payment());
                                    $_SESSION['card_info'] = $card_info;
                                }
                            }
                            $_SESSION['cardReceived']= 100; // ko else				

                            //xac nhan la da thanh toan thanh cong don hang
                            // Thao tac voi co so du lieu
                            // E3.START SAVE LOG SUCCESS
                                    $aParamCardLog=array(
                                                    'transID'               => $order_id,// key để biết được record sẽ updated
                                                    'partnerTransID' 	=> $transaction_id,// partner from đối tác
                                                    'transIdRes' 		=> $transaction_id,// key để biết được record sẽ updated
                                                    //
                                                    'amount'		=> $total_amount, // nếu thành công mới save số tiền vào									
                                                    //
                                                    'cardData'		=> $customerData, 
                                                    // mess
                                                    'errorCode'		=> $transaction_status,
                                                    'errorMessage'		=> $errorMessage,
                                                    'epayStatus'		=> 1,
                                                    //
                                                    'updated' 		=> date("Y-m-d H:i:s"),
                                                    'statusDesc' 		=> "Thành công",
                                                    'status' 		=> "1"
                                            );
                                    // update customer ID for user table                                
                                    $aUpdate	= array("transID","partnerTransID","transIdRes","cardData","amount","errorCode","errorMessage","epayStatus","updated","statusDesc","status");		
                                    $log3 			= $this->db_billing_model->insert_onduplicate_logbilling_update($aParamCardLog,$aUpdate); //ok
                                    //
                                    $code 		= 1;
                                    $msgs[] 	= "Giao dịch thành công.";

                            }			
                            /**
                             * Neu khong thi bo qua
                             */
                    }else{
                            // E3.START SAVE LOG FAILED
                            $aParamCardLog=array(
                                            'transID'               => $order_id,// key để biết được record sẽ updated
                                            'partnerTransID' 	=> $transaction_id,// partner from đối tác
                                            'transIdRes' 		=> $transaction_id,// key để biết được record sẽ updated
                                            //
                                            //'amount'		=> $total_amount, // nếu thành công mới save số tiền vào									
                                            //
                                            'cardData'		=> $customerData, 
                                            // mess
                                            'errorCode'		=> $transaction_status,
                                            'errorMessage'		=> $errorMessage,
                                            'epayStatus'		=> 1,
                                            //
                                            'updated' 		=> date("Y-m-d H:i:s"),
                                            'statusDesc' 		=> "Thất bại",
                                            'status' 		=> "0"
                                    );
                            // update customer ID for user table

                            $aUpdate	= array("transID","partnerTransID","transIdRes","cardData","errorCode","errorMessage","epayStatus","updated","statusDesc","status");		
                            $log3 			= $this->db_billing_model->insert_onduplicate_logbilling_update($aParamCardLog,$aUpdate); //ok
                            //fwrite($fh, ' => INVALID');
                            $code 		= -1;
                            $msgs[] 	= "INVALID.";
                    }
                }else {
                    $code 		= -1;
                    $msgs[]             = "ERROR";
                }
                // end POST    
		if ($error){
			//fwrite($fh, " | ERROR: $error");
			$code 		= -1;
			$msgs[] 	= " | ERROR: $error.";
		}		
		foreach ($msgs as $m){
			$msg.="$m<br/>";			
		}
		$msg	= json_encode(array("code"=>$code,"msg"=>$msg));
		/////////////////
		//echo "bk callback";exit;
		$user_info = $this->session->userdata('user_info');
		if($user_info)
                    $this->smarty->assign("user_info", $user_info);
                if(isset($_SESSION['card_info']))
                    $card_info  = $_SESSION['card_info'];
                else
                    $card_info  = "";
		//		
		$this->smarty
					->assign("card_info" , $card_info)
					->assign("msg"		, json_decode($msg))
					->display('template/topup/home');
	}
	//
	function topup_baokim_cancel(){
            //echo "bk cancel";exit;
            redirect("topup");
	}
	//
	function topup_baokim_detail(){
            redirect("topup");            
	}	
	/**********************************END BẢO KIM*********************************************/
        /**********************************START NGAN LUONG*********************************************/
        function topup_nganluong($Email=NULL){
            // include thư viện            
            require_once APPPATH . 'libraries/pay/nganluong/vi/config_nl.php'; // file config            
            require_once APPPATH . 'libraries/pay/nganluong/vi/include/nganluong.microcheckout.class.php';                            
            //define lai url callback
            $return_url         =   base_url()."topup/topup_nganluong_callback";         
            $cancel_url         =   base_url()."topup/topup_nganluong_cancel";            
            //
            $_SESSION['cardReceived'] = -100; // start session
            //	
            $msgs	= array();
            $msg	= "";
            $code 	= -1;		
            $time	= time();
            $card_info	= "";
            // Get user info
            $user_info = $this->session->userdata('user_info');
            if($Email){
                    $_SESSION['pay']['store_info_init']['Email'] = $Email;
                    $user_info = $this->db_user_model->getUserByEmail($Email);
                    if($user_info){
                        $uID 			= $user_info[0]->uID;
                        $username                   = $user_info[0]->username;
                        $customerID                 = $user_info[0]->customerID;
                        $email 			= $user_info[0]->email;	
                    }    
                }else{
                    // Get user info
                    $user_info = $this->session->userdata('user_info');
                    if($user_info){                    
                        $uID 			= $user_info[0]->uID;
                        $username                   = $user_info[0]->username;
                        $customerID                 = $user_info[0]->customerID;
                        $email 			= $user_info[0]->email;	                    
                    }else{
                        $code 		= -1;
                        $msgs[]             = "Thông tin tài khoản không hợp lệ.";
                    }
                } 
            ////
            $pay_store_info_init	= "";
            if(isset($_SESSION['pay']['store_info_init'])){
                    $pay_store_info_init = $_SESSION['pay']['store_info_init'];
            }else{
                    $code 		= -1;
                    $msgs[] 	= "Dữ liệu khởi tạo không hợp lệ.";
            }            
            ///                       
            $name       = "Bắn tiền cho ".$pay_store_info_init['phonereceiver'];
            $quanty     = 1;
            $price      = "";//
            //$amount     = $pay_store_info_init['cardprice']; //$amount_vi so tien can thanh toan
            $amount     = 2000;
            //$order_code = TRANSID_MUATHE."_".date('His_dmY');//'Order-'.date('His-dmY');
            $order_code =  TRANSID_PAY_BY_NGANLUONG.$pay_store_info_init['phonereceiver']."_".DATE;
            $items      = array();
            $items[]    = array(
                            'item_name'         => $name,
                            'item_quanty'	=> $quanty,
                            'item_amount'	=> $price
            );            
            //$receiver = '';
            $inputs = array(
                    'receiver'		=> RECEIVER,
                    'order_code'	=> $order_code,
                    'amount'		=> $amount,
                    'currency_code'	=> 'vnd',
                    'tax_amount'	=> '0',
                    'discount_amount'	=> '0',
                    'fee_shipping'	=> '0',
                    'request_confirm_shipping'	=> '0',
                    'no_shipping'	=> '1',
                    'return_url'	=> $return_url,
                    'cancel_url'	=> $cancel_url,
                    'language'		=> 'vn',
                    'items'		=> $items
            );
            //print_r($inputs);
            $link_checkout  = '';
            $obj            = new NL_MicroCheckout(MERCHANT_ID, MERCHANT_PASS, URL_WS);
            $result         = $obj->setExpressCheckoutPayment($inputs);
            if($result != false) {
                if ($result['result_code'] == '00') {
                    $link_checkout = $result['link_checkout'];
                } else {
                    //die('Mã lỗi '.$result['result_code'].' ('.$result['result_description'].') ');
                    $code 	= -1;
                    $msgs[]     = 'Mã lỗi '.$result['result_code'].' ('.$result['result_description'].') ';
                }
            }else{
                //die('Lỗi kết nối tới cổng thanh toán Ngân Lượng');
                $code       = -1;
                $msgs[]     = 'Lỗi kết nối tới cổng thanh toán Ngân Lượng';
            }
            
            if(!count($msgs)) {
                // SAVE LOG KHỞI TẠO
                /////////////////////////////////////	
                $log_init			= "";// khởi tạo dữ liệu			
                $log_init['ip'] 		= get_real_ip();
                $log_init['created'] 		= $time;
                $log_init['date'] 		= date("Y-m-d H:i:s");
                $log_init['transID'] 		= $order_code; // chính là order ID
		$log_init['phoneReceiver'] 	= $pay_store_info_init['phonereceiver'];		
                $log_init['cardprice']		= $amount;
                $log_init['typeUse']		= TRANSID_TYPE_USE_BANTIEN;            
                // E1.SAVE LOG KHỞI TẠO GIAO DỊCH TRƯỚC KHI ĐĂNG NHẬP VÀO EPAY
                $aParamCardLog=array(                                
                                'uID' 		=> $uID,				
                                'username'	=> $username,
                                'email' 	=> $email,
                                'customerID' 	=> $customerID,
                                'transID' 	=> $log_init['transID'],
                                // payment info
                                'transactionOrderInfo'=> "Thanh toán đơn hàng ".$log_init['phoneReceiver'],
                                ///                                  
				'phoneReceiver'	=> $log_init['phoneReceiver'],				
                                'cardprice' 	=> $log_init['cardprice'],
                                'paySource' 	=> "nganluong",
                                'typeUse' 	=> $log_init['typeUse'],
                                "date"		=> $log_init['date'],
                                'created' 	=> $log_init['created'],
                                'statusDesc' 	=> "Khởi tạo",
                                'status' 	=> "-2",
                                'ip' 		=> $log_init['ip']
                        );		
                // 
                $log1 				= $this->db_billing_model->ano_logbilling_init($aParamCardLog); //ok
                //echo $link_checkout;exit;
                redirect($link_checkout);
            }else{                                
                //$code 		= -1;
                //$msgs[] 	= "Hệ thống đang bận hoặc bảo trì, vui lòng quay lại sau.";
                foreach ($msgs as $m){
                        $msg.="$m<br/>";			
                }
                $msg	= json_encode(array("code"=>$code,"msg"=>$msg));
                // end get session from epay
                $user_info = $this->session->userdata('user_info');
                if($user_info)
                    $this->smarty->assign("user_info", $user_info);
                //
                $this->smarty
                            ->assign("msg", json_decode($msg))
                            ->display('template/topup/home');
            }     
	}
	//
	function topup_nganluong_callback(){            
            // include thu vien
            require_once APPPATH . 'libraries/pay/nganluong/vi/config_nl.php'; // file config
            //require_once APPPATH . 'libraries/pay/nganluong/vi/include/lib/nusoap.php';
            require_once APPPATH . 'libraries/pay/nganluong/vi/include/nganluong.microcheckout.class.php';
            //	
            $msgs	= array();
            $msg	= "";
            $code 	= -1;		
            $time	= time();
            $card_info	= "";
            $user_info  = "";
            //khai bao
            $obj        = new NL_MicroCheckout(MERCHANT_ID, MERCHANT_PASS, URL_WS);

            if ($obj->checkReturnUrlAuto()) {
                $inputs = array(
                            'token'		=> $obj->getTokenCode(),//$token_code,
                );
                $result     = $obj->getExpressCheckout($inputs);
                if ($result != false) {
                    if ($result['result_code'] != '00') {
                        //die('Mã lỗi '.$result['result_code'].' ('.$result['result_description'].') ');
                        $code 	= -1;
                        $msgs[] = 'Mã lỗi '.$result['result_code'].' ('.$result['result_description'].') ';
                    }
                } else {
                    //die('Lỗi kết nối tới cổng thanh toán Ngân Lượng');
                    $code 	= -1;
                    $msgs[] 	= 'Lỗi kết nối tới cổng thanh toán Ngân Lượng';
                }
            } else {
                //die('Tham số truyền không đúng');
                $code           = -1;
                $msgs[] 	= 'Tham số truyền không đúng';
            }
            ///
            if(!count($msgs)) {
            //print_r($result);exit;
                // Mai check tiep cho nay // sao ma duy nhat thoi.
                if (isset($result) && !empty($result)) {
                    if ($result['result_code'] == '00') { // giao dich thanh cong                        
                        
                        // GET VALUE                    
                        $order_code      = $this->null2unknown(@$_GET["order_code"]);// phuong thuc get
                        $transaction_id  = $this->null2unknown($result["transaction_id"]);
                        $errorCode       = $this->null2unknown($result['transaction_status']);                    
                        $methodPayment   = $this->null2unknown($result['method_payment_name']);
                        $amount          = $this->null2unknown($result['amount']);
                        $orderInfo       = $this->null2unknown(($result['transaction_type'] == 1 ? 'Thanh toán ngay' : 'Thanh toán tạm giữ'));
                        // info about user pay
                        $receiverName     = $this->null2unknown($result['payer_name']);
                        $receiverEmail    = $this->null2unknown($result['payer_email']);
                        $receiverPhone    = $this->null2unknown($result['payer_mobile']);
                        $cardAmount       = $this->null2unknown($result['card_amount']);
                        $customerData     = $receiverName."-".$receiverEmail."-".$receiverPhone."-".$cardAmount;
                        // code here                        
                        // check chỉ get 1 lần duy nhất ứng với mỗi giao dịch.
                        // check session va status cua giao dich                          
                        if(isset($order_code)){
                            $this->topup_getCardCodeCallBack($order_code, $card_info);//goi kho the simpay
                        }                        
                        // E3.START SAVE LOG SUCCESS
                        $aParamCardLog=array(
                            'transID'               => $order_code,// key để biết được record sẽ updated
                            'partnerTransID' 	=> $transaction_id,// partner from đối tác
                            'transIdRes'            => $transaction_id,// key để biết được record sẽ updated
                            //
                            'amount'		=> $amount, // nếu thành công mới save số tiền vào									
                            //
                            'cardData'		=> $customerData, 
                            'phoneReceiver'		=> $receiverPhone, 
                            // mess
                            'errorCode'		=> $errorCode,
                            'errorMessage'          => $orderInfo,
                            'epayStatus'            => 1,
                            //
                            'updated' 		=> date("Y-m-d H:i:s"),
                            'statusDesc'            => "Thành công",
                            'status' 		=> "1"
                        );
                        // update customer ID for user table
                        $aUpdate            = array("transID","partnerTransID","transIdRes","cardData","amount","errorCode","errorMessage","updated","statusDesc","status");		
                        $log3 		= $this->db_billing_model->insert_onduplicate_logbilling_update($aParamCardLog,$aUpdate); //ok
                        //
                        $code 		= 1;
                        $msgs[]             = "Giao dịch thành công.";                        
                        
                        //print_r($result);exit;
                    }else{
                        //echo $result['result_description'];
                        // E3.START SAVE LOG FAILED
                        $aParamCardLog=array(
                            'transID' 		=> $result["transaction_id"],// key để biết được record sẽ updated
                            'partnerTransID'        => $result["transaction_id"],// key để biết được record sẽ updated
                            'transIdRes'            => $result["transaction_id"],// key để biết được record sẽ updated                                                                          
                            // mess
                            'errorCode'		=> $result['result_code'],
                            'errorMessage'          => $result['result_description'],
                            //
                            'updated' 		=> date("Y-m-d H:i:s"),
                            'statusDesc'            => "Thất bại",
                            'status' 		=> "0"
                        );
                        //print_r($aParamCardLog);exit;
                        // update customer ID for user table
                        $aUpdate        = array("transID","partnerTransID","transIdRes","errorCode","errorMessage","updated","statusDesc","status");		
                        $log3           = $this->db_billing_model->insert_onduplicate_logbilling_update($aParamCardLog,$aUpdate); //ok
                        $code           = -1;
                        $msgs[]         = 'Giao dịch thất bại. Error: '.$result['result_description'];
                        //print_r($result);exit;
                    }
                }
            }
            foreach ($msgs as $m){
                    $msg.="$m<br/>";			
            }
            $msg	= json_encode(array("code"=>$code,"msg"=>$msg));
            // end get session from epay            
            $user_info      = $this->session->userdata('user_info');
            if($user_info)
                $this->smarty->assign("user_info", $user_info);
            if(isset($_SESSION['card_info']))
                $card_info  = $_SESSION['card_info'];
            //print_r($_SESSION);exit;
            //
            $this->smarty                    
                    ->assign("msg"		, json_decode($msg))
                    ->assign("card_info"        , $card_info)
                    ->display('template/topup/home');
        }
        function topup_nganluong_cancel(){
            redirect("topup");exit;
	}
	//
	function topup_nganluong_detail(){
            redirect("topup");exit;            
	}
        /**********************************END NGAN LUONG*********************************************/
        // CHECK GET MA THE WHEN PAYMENT CALLBACK
        function topup_getCardCodeCallBack($transID=null,&$card_info=null){
            if($transID){
                // check ton tai truowcs khi check trang thai giao dich
                $trans_status = $this->db_billing_model->checkTransIDStatus($transID);// =1ok;else:false                
                if ($trans_status){ // if ton tai giao dich
                    // check session va status cua giao dich                            
                    $tmp_status = $this->db_billing_model->getTransIDStatus($transID);// =1ok;else:false
                    
                    if($tmp_status!=1){ // get card code before 
                        if($_SESSION['cardReceived']!=100){
                            //echo $_SESSION['cardReceived'];//exit;
                            // CHUYỂN QUA BƯỚC NAP TIEN CHO DIEN THOAI
                            $card_info	= json_decode($this->topup_open_payment());
                            $_SESSION['card_info'] = $card_info;
                            $_SESSION['cardReceived']= 100; // ko else
                        }
                    }
                    
                    //print_r($card_info);exit;
               }     
            }
        }
	/// TOPUP PHONE FOR SMARTLINK/VÍ CỘNG ĐỒNG KHÁC
	/// TOPUP PHONE BỞI VÍ ĐIỆN TỬ
        // DANH CHO TRUOWNG HOP POPUP NEN GET SESSION
	function topup_open_payment()
	{
		//	
		$msgs	= array();
		$msg	= "";
		$code 	= -1;
		$Coin	= "";
		if(isset($_SESSION['pay']['store_info_init']))
		{			
                    $pay_store_info_init = $_SESSION['pay']['store_info_init'];
                    //print_r($pay_store_info_init);exit;
                    // GET VALUE FROM SESSION
                    $data['phoneReceiver']	= $pay_store_info_init['phonereceiver'];
                    $data['cardprice']		= $pay_store_info_init['cardprice'];
                    $data['paymethod']		= $pay_store_info_init['paymethod'];	
		}else{
                    $code 		= -1;
                    $msgs[] 	= "Thông tin bắn tiền không hợp lệ.B.0.1";
                }				
				
				                
		// Get user info
		$user_info = $this->session->userdata('user_info');
		// Nếu chưa login thì redirect qua form nhập thông tin.		
		if(!$user_info){
                    if(isset($_SESSION['pay']['store_info_init']['Email'])){
                        $Email      = $_SESSION['pay']['store_info_init']['Email'];                        
                        $user_info  = $this->db_user_model->getUserByEmail($Email);                        
                        if($user_info){
                            $uID 			= $user_info[0]->uID;
                            $username                   = $user_info[0]->username;
                            $customerID                 = $user_info[0]->customerID;
                            $email 			= $user_info[0]->email;	                            
                        }else{
                            $code 		= -1;
                            $msgs[]             = "Thông tin tài khoản không hợp lệ.B.0.1";			
                        }                            
                    }			
		}else{ // else thì check số tiền trong ví.
                    $uID 			= $user_info[0]->uID;
                    $username                   = $user_info[0]->username;
                    $customerID                 = $user_info[0]->customerID;
                    $email 			= $user_info[0]->email;	
		}
		// code here
		/////////////////////////////////////	                
		$log_init					= "";// khởi tạo dữ liệu			
		$log_init['ip'] 			= get_real_ip();
		$log_init['created'] 		= time();
		$log_init['date'] 			= date("Y-m-d H:i:s");
		$log_init['transID'] 		= TRANSID_BANTIEN.$data['phoneReceiver']."_".DATE;
		$log_init['phoneReceiver'] 		= $data['phoneReceiver'];		
		$log_init['cardprice'] 		= $data['cardprice'];
		$log_init['paymethod']		= $data['paymethod'];
		$log_init['typeUse']		= TRANSID_TYPE_USE_BANTIEN;
		// START - SAU KHI NẠP THẺ LẬP TỨC KHỞI TẠO LOG GIAO DỊCH CHO DÙ SAI HAY ĐÚNG.
		// E1.SAVE LOG KHỞI TẠO GIAO DỊCH TRƯỚC KHI ĐĂNG NHẬP VÀO EPAY
		$aParamCardLog=array(                                
				'uID' 			=> $uID,				
				'username'		=> $username,
				'email' 		=> $email,
				'customerID' 	=> $customerID,
				'transID' 		=> $log_init['transID'],				
				'phoneReceiver'	=> $log_init['phoneReceiver'],				
				'cardprice' 	=> $log_init['cardprice'],
				'typeUse' 		=> $log_init['typeUse'],
                                'paySource' 		=> 'smartlink',
				"date"			=> $log_init['date'],
				'created' 		=> $log_init['created'],
				'statusDesc' 	=> "Khởi tạo",
				'status' 		=> "-2",
				'ip' 			=> $log_init['ip']
			);						
		if(!count($msgs)) {	
			// save log đợt 1
			$log1 			= $this->db_billing_model->ano_logbilling_init($aParamCardLog); //ok		
			// END - E1.SAU KHI NẠP THẺ LẬP TỨC KHỞI TẠO LOG GIAO DỊCH CHO DÙ SAI HAY ĐÚNG.
                        // CO THE VIET CONTROLL TU CHO NAY DANH CHO 3 KHO THE// EPAY,FPT,SIMPAY,....
			$this->topupDirectToPhoneFromEpay($data,$log_init, $msgs);// goi kho the epay		
                        //$this->getCardFromSimpayStore($log_init, $msgs);//goi kho the simpay						
		}// end check count msg
		foreach ($msgs as $m){
			$msg.="$m<br/>";			
		}
		$msg	= json_encode(array("code"=>$code,"msg"=>$msg));
		return $msg;//exit;
	}
        /**********************************START KHO THE EPAY***************************************/
        function topupDirectToPhoneFromEpay($data,$log_init, $msgs){
            ///
            $user_info = $this->session->userdata('user_info');
            //print_r($user_info);exit;
            //// GỌI THƯ VIỆN EPAY///////////////
            require_once(APPPATH.'libraries/pay/epay/ItopupClient.php');
            $itopupClient 			= new ItopupClient();
            // 1. Ðăng nhập hệ thống
            $result 				= $itopupClient->signIn();					
            // Kết quả sau khi đăng nhập.
            if($itopupClient->errorCode==0)
            {
                    try{
                            $errorCode			= $itopupClient->errorCode;// Ma 0: thanh cong
                            $errorMessage		= $itopupClient->errorMessage;
                            $errortoken			= $itopupClient->token;// Ma cua phien lam viec
                            $requestID 			= $itopupClient->generateRandomRequestID();					
                            // E2.START SAVE LOG KHỞI TẠO GIAO DỊCH SAU KHI LOGIN VÀO EPAY SYSTEM
                            $aParamCardLog=array(
                                            'requestID' 	=> $requestID,
                                            'transID' 		=> $log_init['transID'],// key để biết được record sẽ updated
                                            'updated' 		=> date("Y-m-d H:i:s"),
                                            // Logined Epay info
                                            'errorCode' 	=> $errorCode,
                                            'errorMessage' 	=> $errorMessage,
                                            //
                                            'statusDesc' 	=> "Chưa hoàn thành",
                                            'status' 		=> "-1"
                                    );
                            // update customer ID for user table
                            $aUpdate		= array("requestID","updated","errorCode","errorMessage","statusDesc","status");
                            $log2 			= $this->db_billing_model->insert_onduplicate_logbilling_update($aParamCardLog,$aUpdate); //ok
                            // E2.END SAVE LOG KHỞI TẠO GIAO DỊCH SAU KHI LOGIN VÀO EPAY SYSTEM
                            //
                            
                            /////////////// GỌI HÀM BẮN TIỀN/////////////////////// 
                            $result				= $this->directTopup($itopupClient,$data['phoneReceiver'],$data['cardprice'],$requestID);
                            //echo $result["epayTransID"];
                            //print_r($result);exit;
                            // 1. Gửi kết quả về từ Epay
                            // Epay trans ID info success
                            if($result['epayTransID']>0 && $result['epayStatus']>0){ // có giao dịch và giao dịch hợp lệ																		

                                    // notice info							
                                    $purchase_res['epayTransID']		= $result["epayTransID"];
                                    $purchase_res['merchantID']			= $result["merchantID"];
                                    $purchase_res['merchantBalance']	= $result["merchantBalance"];
                                    $purchase_res['epayStatus']			= $result["epayStatus"];
                                    $purchase_res['errorCode']			= $result["errorCode"];
                                    $purchase_res['errorMessage']		= $result["errorMessage"];
                                    $purchase_res['requestID']			= $requestID;                                    
                                    //$purchase_res['phoneReceiver']		= $log_init['phoneReceiver'];//$product['productValue'];
                                    //$purchase_res['cardprice']			= $log_init['cardprice'];//$product['productID'];
                                    //$purchase_res['providerName']		= $card_info[0]->providerName;//$result['productID'];
                                    
                                    // user info
                                    if($user_info)
                                    {
                                            $purchase_res['customerID']			= $user_info[0]->customerID;
                                            $purchase_res['email']				= $user_info[0]->email;
                                    }
                                    $purchase_res['merchantBalance']		= $result["merchantBalance"];								
                                    // E3.START SAVE LOG SUCCESS
                                    $aParamCardLog=array(
                                                    'transID' 		=> $log_init['transID'],// key để biết được record sẽ updated
                                                    'epayStatus' 	=> $purchase_res['epayStatus'],
                                                    'partnerTransID'=> $purchase_res['epayTransID'],
                                                    'transIdRes'	=> $purchase_res['epayTransID'],
                                                    'errorCode' 	=> $purchase_res['errorCode'],
                                                    'errorMessage' 	=> $purchase_res['errorMessage'],
                                                    //
                                                    'merchantID' 	=> $purchase_res['merchantID'],
                                                    'merchantBalance' => $purchase_res['merchantBalance'],
                                                    //card info								
                                                    'amount'		=> $log_init['cardprice'], // nếu thành công mới save số tiền vào									
                                                    //'cardType'		=> $purchase_res['providerName'],
                                                    //
                                                    'updated' 		=> date("Y-m-d H:i:s"),
                                                    'statusDesc' 	=> "Thành công",
                                                    'status' 		=> "1"
                                            );
                                    // update customer ID for user table
                                    $aUpdate	= array("epayStatus","partnerTransID","transIdRes","merchantID","merchantBalance","errorCode","errorMessage","amount","updated","statusDesc","status");
                                    $log3 			= $this->db_billing_model->insert_onduplicate_logbilling_update($aParamCardLog,$aUpdate); //ok
                                    // E3.END SAVE LOG SUCCESS					
                                    $code 		= 1;
                                    $msgs[] 	= "Giao dịch thành công.";	

                            }else{ // Epay trans ID info failed
                                    $purchase_res['epayStatus']				= $result['epayStatus']; // lấy mã thẻ thất bại. 
                                    $purchase_res['epayTransID']			= $result['epayTransID'];
                                    $purchase_res['merchantID']				= $result["merchantID"];
                                    $purchase_res['merchantBalance']		= $result["merchantBalance"];
                                    $purchase_res['errorCode']				= $result['errorCode'];
                                    $purchase_res['errorMessage']			= $result['errorMessage'];
                                    // E3.START SAVE LOG FAILED
                                    $aParamCardLog=array(
                                                    'transID' 		=> $log_init['transID'],// key để biết được record sẽ updated
                                                    'epayStatus' 	=> $purchase_res['epayStatus'],
                                                    'partnerTransID'=> $purchase_res['epayTransID'],
                                                    'transIdRes' 	=> $purchase_res['epayTransID'],
                                                    //
                                                    'merchantID' 	=> $purchase_res['merchantID'],
                                                    'merchantBalance' => $purchase_res['merchantBalance'],
                                                    //
                                                    'errorCode' 	=> $purchase_res['errorCode'],
                                                    'errorMessage' 	=> $purchase_res['errorMessage'],
                                                    'updated' 		=> date("Y-m-d H:i:s"),
                                                    'statusDesc' 	=> "Thất bại",
                                                    'status' 		=> "0"
                                            );
                                    // update customer ID for user table
                                    $aUpdate	= array("epayStatus","partnerTransID","transIdRes","merchantID","merchantBalance","errorCode","errorMessage","updated","statusDesc","status");
                                    $log3 			= $this->db_billing_model->insert_onduplicate_logbilling_update($aParamCardLog,$aUpdate); //ok
                                    // E3.END SAVE LOG FAILED
                                    $code 		= -1;
                                    $msgs[] 	= "Bắn tiền không thành công.B002";	
                            } // End result
                            // Nên trả về json, sau đó truyền qua ajax rồi xử lý tiếp
                            // product
                            //echo json_encode($purchase_res);//exit;
                            //print_r($purchase_res);exit;
                            // 2. Gửi email cho user
                    } catch (Exception $e) {
                            //echo 'Caught exception: ',  $e->getMessage(), "\n";exit;
                            $code 		= -1;
                            $msgs[] 	= "Caught exception: .".$e->getMessage();
                    }				
            }else{
                    // không kết nối dc với hệ thống epay.
                    //echo "Hệ thống đang bận hoặc bảo trì, vui lòng quay lại sau.E001.";exit;
                    $code 		= -1;
                    $msgs[] 	= "Hệ thống đang bận hoặc bảo trì, vui lòng quay lại sau.E001.";
            }// end kết quả sau khi đăng nhập
        }
        /**********************************END KHO THE EPAY***************************************/
        
	/////////////////////////////END BUY CARD BY EPAY ///////////////////////////////	    	   
}

/* End of file admin/cpanel.php */
/* Location: ./system/application/controllers/admin/cpanel.php */